package cn.cau.epidemicsurveysystem.service.impl;

import cn.cau.epidemicsurveysystem.bean.*;
import cn.cau.epidemicsurveysystem.dao.*;
import cn.cau.epidemicsurveysystem.service.TemplateService;
import cn.cau.epidemicsurveysystem.vo.QuestionAnsVO;
import cn.cau.epidemicsurveysystem.vo.QuestionVO;
import cn.cau.epidemicsurveysystem.vo.TemplateAnsVO;
import cn.cau.epidemicsurveysystem.vo.TemplateVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

/**
 * @projectName: gp2022
 * @package: cn.cau.epidemicsurveysystem.service.impl
 * @className: TemplateServiceImpl
 * @author: zy
 * @description: 返回模板相关业务
 * @date: 2022/2/28 17:35
 * @version: 1.0
 */

@Service
public class TemplateServiceImpl implements TemplateService {
    @Autowired
    EpidTemplateRepository templateRepository;
    @Autowired
    EpidTemplateQuestionRepository questionRepository;
    @Autowired
    EpidTemplateOptionRepository optionRepository;
    @Autowired
    QuestionAnsRepository questionAnsRepository;
    @Autowired
    EpidMissionRecordRepository missionRepository;

    @Override
    /**
     * @param question:查询的问题实体
      * @return List<EpidTemplateOptionBean>
     * @author zy
     * @description 返回一个问题对应的所有选项，并返回一个QuestionVO视图对象
     * @date 2022/3/1 10:54
     */
    public QuestionVO getQuestionVOByQuestion(EpidTemplateQuestionBean question) {
        int id = question.getEpidTemplateQuestionId();
        List<EpidTemplateOptionBean> options= optionRepository.findEpidTemplateOptionBeansByEpidTemplateQuestionIdEqualsOrderByOptionPos(id);
        QuestionVO questionVO = new QuestionVO(question,options);
        return questionVO;
    }

    @Override
    /**
     * @param name: 查询的模板名称
      * @return TemplateVO
     * @author zy
     * @description 返回一个模板对应的所有问题，并返回一个TemplateVO视图对象
     * @date 2022/2/28 19:05
     */
    public TemplateVO getTemplateVOByName(String name) {
        //template为name对应模板
        EpidTemplateBean template = templateRepository.getEpidTemplateBeanByTemplateNameEquals(name);
        //questions为template中的所有问题
        List<EpidTemplateQuestionBean> questions= questionRepository.findEpidTemplateQuestionBeansByEpidTemplateIdEqualsOrderByQuestionPosAsc(template.getEpidTemplateId());
        List<QuestionVO> questionVOs = new ArrayList<>();
        for(EpidTemplateQuestionBean question:questions) questionVOs.add(getQuestionVOByQuestion(question));
        return new TemplateVO(template,questionVOs);
    }


    /**
     * @param name: 待查询模板名称
    	 * @param patientId: 回答模板病人id
    	 * @param date: 病人回答模板日期
      * @return TemplateAnsVO ：该病人当时回答该模板的答案
     * @author zy
     * @description 根据模板名称、病人id、回答日期返回模板答案
     * @date 2022/3/1 15:03
     */
    @Override
    public TemplateAnsVO getTemplateAnsVOByname(String name, int patientId, Timestamp date) {
        EpidTemplateBean template = templateRepository.getEpidTemplateBeanByTemplateNameEquals(name);
        int id = template.getEpidTemplateId();
        List<EpidTemplateQuestionBean> questions = questionRepository.findEpidTemplateQuestionBeansByEpidTemplateIdEqualsOrderByQuestionPosAsc(id);
        List<QuestionAnsVO> questionsAndAnswers = new ArrayList<>();
        for(EpidTemplateQuestionBean question:questions){
            QuestionAnsVO quesAndAns= getQuestionAnsVOByQuestion(question,patientId,date);
            questionsAndAnswers.add(quesAndAns);
        }
        return new TemplateAnsVO(template,questionsAndAnswers);
    }

    /**
     * @param question: 待查询答案的问题
    	 * @param patientId: 回答该问题的病人id
    	 * @param date: 该病人的回答时间
      * @return QuestionAnsVO ：返回该问题的所有选项，该病人对于该问题的回答
     * @author zy
     * @description 返回该问题的所有选项，该病人对于该问题的回答
     * @date 2022/3/1 14:59
     */
    @Override
    public QuestionAnsVO getQuestionAnsVOByQuestion(EpidTemplateQuestionBean question, int patientId, Timestamp date) {
        QuestionVO questionVO = getQuestionVOByQuestion(question);
        QuestionAnsBean ans = questionAnsRepository.findQuestionAnsBeanByQuestionIdEqualsAndPatientIdEqualsAndDateEquals(question.getEpidTemplateQuestionId(),patientId,date);
        return new QuestionAnsVO(questionVO,ans);
    }

    /**
     * @param :
      * @return List<EpidTemplateBean> 一个包含所有数据库基本信息的List
     * @author zy
     * @description 返回数据库中的所有模板基本信息
     * @date 2022/3/2 11:31
     */
    @Override
    public List<EpidTemplateBean> getAllTemplate() {
        return templateRepository.findAll();
    }

    /**
     * @param :
      * @return EpidTemplateBean :返回一个新的template
     * @author zy
     * @description TODO
     * @date 2022/3/2 15:27
     */
    @Override
    public EpidTemplateBean addTemplate(EpidTemplateBean epidTemplateBean) {
        return templateRepository.save(epidTemplateBean);
    }

    /**
     * @param epidTemplateQuestionBean:
      * @return EpidTemplateQuestionBean
     * @author zy
     * @description 返回一个新的question对象
     * @date 2022/3/2 15:58
     */
    @Override
    public EpidTemplateQuestionBean addQuestion(EpidTemplateQuestionBean epidTemplateQuestionBean) {
        return questionRepository.save(epidTemplateQuestionBean);
    }

    /**
     * @param optionBean:
      * @return EpidTemplateOptionBean
     * @author zy
     * @description 返回一个新的option对象
     * @date 2022/3/2 16:26
     */
    @Override
    public EpidTemplateOptionBean addOption(EpidTemplateOptionBean optionBean) {
        return optionRepository.save(optionBean);
    }

    @Override
    public TemplateVO getTemplateVOById(int id) {
        //template为id对应模板
        EpidTemplateBean template = templateRepository.getEpidTemplateBeanByEpidTemplateIdEquals(id);
        //questions为template中的所有问题
        List<EpidTemplateQuestionBean> questions= questionRepository.findEpidTemplateQuestionBeansByEpidTemplateIdEqualsOrderByQuestionPosAsc(template.getEpidTemplateId());
        List<QuestionVO> questionVOs = new ArrayList<>();
        for(EpidTemplateQuestionBean question:questions) questionVOs.add(getQuestionVOByQuestion(question));
        return new TemplateVO(template,questionVOs);
    }


    /**
     * @param missionId: 待查询的任务id
    	 * @param question: 待查询的任务id中某个问题
      * @return QuestionAnsVO ：返回该次问卷调查中，该问题的答案
     * @author zy
     * @description TODO
     * @date 2022/3/3 15:12
     */
    @Override
    public QuestionAnsVO getQuestionAnsVOByMissionIdAndQuestion(int missionId, EpidTemplateQuestionBean question) {
        QuestionAnsBean ans = questionAnsRepository.findQuestionAnsBeanByQuestionIdEqualsAndMissionIdEquals(question.getEpidTemplateQuestionId(),missionId);
        QuestionVO questionVO = getQuestionVOByQuestion(question);
        return new QuestionAnsVO(questionVO,ans);
    }

    /**
     * @param missionId: 待查询的任务id
      * @return TemplateAnsVO
     * @author zy
     * @description 根据一个任务id，查询相应的问卷答案
     * @date 2022/3/3 15:08
     */
    @Override
    public TemplateAnsVO getTemplateAnsVOByMissionId(int missionId) {
        EpidMissionRecordBean mission = missionRepository.findEpidMissionRecordBeanByMissionId(missionId);
        int id = mission.getEpidTemplateId();
        EpidTemplateBean template = templateRepository.getEpidTemplateBeanByEpidTemplateIdEquals(id);
        List<EpidTemplateQuestionBean> questions = questionRepository.findEpidTemplateQuestionBeansByEpidTemplateIdEqualsOrderByQuestionPosAsc(id);
        List<QuestionAnsVO> questionsAndAnswers = new ArrayList<>();
        for(EpidTemplateQuestionBean question:questions){
            QuestionAnsVO quesAndAns= getQuestionAnsVOByMissionIdAndQuestion(missionId,question);
            questionsAndAnswers.add(quesAndAns);
        }
        return new TemplateAnsVO(template,questionsAndAnswers);
    }
}
